home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / dev / e / capus2.lha / capus2 / ClickCx / Sources / ClickCx.e next >
Encoding:
Text File  |  1995-04-04  |  30.8 KB  |  941 lines

  1. /*=========================================================================================*/
  2. /* Source code generate by Gui2E v0.1 © 1994 NasGûl                                        */
  3. /*=========================================================================================*/
  4. /*======<<< Peps Header >>>======
  5.  PRGVERSION '0'
  6.  ================================
  7.  PRGREVISION '4'
  8.  ================================
  9.  AUTHOR      'NasGûl'
  10.  ===============================*/
  11. /*======<<<   History   >>>======
  12.  ===============================*/
  13. OPT OSVERSION=37
  14.  
  15.  
  16. MODULE 'intuition/intuition','gadtools','libraries/gadtools','intuition/gadgetclass','intuition/screens',
  17.        'graphics/text','exec/lists','exec/nodes','exec/ports','eropenlib','utility/tagitem'
  18. MODULE 'reqtools','libraries/reqtools'
  19. MODULE 'dos/dostags','wbmessage','dos/dosextens'
  20. MODULE 'wb','workbench/workbench','workbench/startup'
  21. MODULE 'dos/notify'
  22. MODULE 'commodities'
  23. MODULE 'libraries/commodities'
  24. MODULE 'intuition/intuitionbase'
  25. MODULE 'icon','mheader','utility'
  26. MODULE 'dos/dos'
  27. MODULE 'dos/rdargs'
  28.  
  29.  
  30. CONST EVT_HOTKEY=1
  31.  
  32. CONST DEBUG=FALSE
  33.  
  34. CONST FMODE_WB=1,
  35.       FMODE_CLI=2
  36.  
  37.  
  38. ENUM ER_NONE,ER_LOCKSCREEN,ER_VISUAL,ER_CONTEXT,ER_MENUS,ER_GADGET,ER_WINDOW,ER_MEM,
  39.      ER_CX,ER_PORT,ER_NOPREFS,ER_BADARGS,ER_NOICONS,ER_APPWIN
  40. /*"Window Defs"*/
  41. DEF screen:PTR TO screen,
  42.     visual=NIL,
  43.     tattr:PTR TO textattr,
  44.     reelquit=FALSE,
  45.     offy,offx
  46. /*=======================================
  47.  = cr Definitions
  48.  =======================================*/
  49. DEF cr_window=NIL:PTR TO window
  50. DEF cr_glist=NIL
  51. /*==================*/
  52. /*     Gadgets      */
  53. /*==================*/
  54. CONST GA_GLIST=0
  55. CONST GA_GEDIT=1
  56. CONST GA_G4=2
  57. CONST GA_G_WB=3
  58. CONST GA_G_CLI=4
  59. CONST GA_G_INFO=5
  60. /*=============================
  61.  = Gadgets labels of cr
  62.  =============================*/
  63. DEF glist
  64. DEF gedit
  65. DEF g4
  66. DEF g_wb
  67. DEF g_cli
  68. DEF g_info
  69. /**/
  70. /*"App Defs"*/
  71.  
  72. OBJECT apparg
  73.     numargs:LONG
  74.     arglist:LONG
  75. ENDOBJECT
  76.  
  77. OBJECT xarg
  78.   node:ln
  79.   predlist:LONG   /* 14 */
  80.   curdir:LONG     /* 18 */
  81.   mode:LONG       /* 22 */
  82.   args:LONG       /* 26 */
  83.   stack:LONG
  84.   pri:LONG
  85.   noclosew:LONG
  86. ENDOBJECT
  87.  
  88. OBJECT xblock
  89.   node:ln
  90.   predlist:LONG
  91.   numlist:LONG
  92.   list:LONG
  93. ENDOBJECT
  94.  
  95. OBJECT xdatabase
  96.   listxblock:LONG         /* exec list */
  97.   nreq:LONG               /* PTR TO notifyrequest */
  98.   nreqsigflag:LONG        /* For Wait() */
  99.   prgport:LONG            /* PTR TO mp */
  100.   appwindow:LONG          /**/
  101.   prgsigflag:LONG         /* For Wait() */
  102.   broker:LONG             /**/
  103.   cxport:LONG             /* PTR TO mp */
  104.   cxsigflag:LONG          /* For Wait() */
  105.   cxhotkey:LONG           /* STRING */
  106.   cxpri:LONG
  107.   wbhandle:LONG
  108.   allscreen:LONG
  109.   defdir:LONG
  110.   zoomed:LONG
  111.   editcmd:LONG
  112. ENDOBJECT
  113.  
  114. DEF mb:PTR TO xdatabase
  115. DEF baselock
  116. DEF currentnode=-1,currentlist:PTR TO lh
  117. DEF popup=FALSE
  118. DEF autocmd[256]:STRING
  119. /**/
  120. PMODULE 'PModules:PlistNoSort'
  121. PMODULE 'PModules:dWriteF'
  122. PMODULE 'PModules:PMHeader'
  123. PMODULE 'PModules:pListView'
  124. PMODULE 'ClickCxWindows'
  125. /*"Message Proc"*/
  126. /*"p_LookAllMessage()"*/
  127. PROC p_LookAllMessage() 
  128.     DEF sigreturn=NIL
  129.     DEF crport:PTR TO mp
  130.     IF cr_window THEN crport:=cr_window.userport ELSE crport:=NIL
  131.     sigreturn:=Wait(Shl(1,crport.sigbit) OR
  132.                         mb.nreqsigflag OR
  133.                     mb.prgsigflag OR
  134.                     mb.cxsigflag OR
  135.                     $F000)
  136.     IF (sigreturn AND Shl(1,crport.sigbit))
  137.         IF (p_LookcrMessage())=TRUE THEN p_CloseWindow()
  138.     ENDIF
  139.     IF (sigreturn AND mb.nreqsigflag)
  140.         IF cr_window<>NIL THEN p_LockListView(glist,cr_window)
  141.         p_CleanPrgList(mb.listxblock)
  142.         p_ReadFile('Env:ClickCx.Prefs')
  143.         currentlist:=mb.listxblock
  144.         currentnode:=0
  145.         IF cr_window<>NIL THEN p_UnLockListView(glist,cr_window,mb.listxblock)
  146.         IF cr_window<>NIL THEN p_RendercrWindow()
  147.     ENDIF
  148.     IF (sigreturn AND mb.prgsigflag)
  149.         IF (p_LookAppMessage())=TRUE THEN p_CloseWindow()
  150.     ENDIF
  151.     IF (sigreturn AND mb.cxsigflag)
  152.         p_LookCxMessage()
  153.     ENDIF
  154.     IF (sigreturn AND $F000)
  155.         reelquit:=TRUE
  156.     ENDIF
  157. ENDPROC
  158. /**/
  159. /*"p_LookAppMessage()"*/
  160. PROC p_LookAppMessage() 
  161.     DEF appmsg:PTR TO appmessage
  162.     DEF n:PTR TO ln
  163.     DEF na=NIL:PTR TO xarg
  164.     DEF ret=TRUE
  165.     dWriteF(['p_LookAppMessage()\n'],0)
  166.     p_LockListView(glist,cr_window)
  167.     WHILE appmsg:=GetMsg(mb.prgport)
  168.         n:=p_GetAdrNode(currentlist,currentnode)
  169.         IF n<>-1
  170.             IF StrCmp(n.name,'»» ',3)
  171.                 NOP
  172.                 ret:=FALSE
  173.             ELSE
  174.                 p_StartProgram(currentlist,currentnode,0,appmsg)
  175.                 na:=n
  176.             ENDIF
  177.         ENDIF
  178.         ReplyMsg(appmsg)
  179.     ENDWHILE
  180.     p_UnLockListView(glist,cr_window,currentlist)
  181.     IF na<>NIL
  182.         IF na.noclosew THEN ret:=FALSE
  183.     ENDIF
  184.     RETURN ret
  185. ENDPROC
  186. /**/
  187. /*"p_LookCxMessage()"*/
  188. PROC p_LookCxMessage() 
  189.     DEF msgid=NIL,msgtype=NIL
  190.     DEF returnvalue=TRUE,msg
  191.     dWriteF(['p_LookCxMessage()\n'],0)
  192.     WHILE msg:=GetMsg(mb.cxport)
  193.         msgid:=CxMsgID(msg)
  194.         msgtype:=CxMsgType(msg) 
  195.         SELECT msgtype 
  196.             CASE CXM_IEVENT 
  197.                 SELECT msgid 
  198.                     CASE EVT_HOTKEY 
  199.                         IF cr_window=NIL 
  200.                             p_OpenWindow() 
  201.                         ELSE
  202.                             p_CloseWindow() 
  203.                         ENDIF 
  204.                 ENDSELECT 
  205.             CASE CXM_COMMAND 
  206.                 SELECT msgid
  207.                     CASE CXCMD_KILL 
  208.                         reelquit:=TRUE 
  209.                         returnvalue:=FALSE 
  210.                     CASE  CXCMD_DISABLE 
  211.                         ActivateCxObj(mb.broker,0)
  212.                     CASE CXCMD_ENABLE
  213.                         ActivateCxObj(mb.broker,1)
  214.                     CASE CXCMD_APPEAR 
  215.                         IF cr_window=NIL
  216.                             p_OpenWindow() 
  217.                         ELSE 
  218.                             WindowToFront(cr_window) 
  219.                         ENDIF 
  220.                     CASE CXCMD_DISAPPEAR 
  221.                         IF cr_window<>NIL 
  222.                             p_CloseWindow() 
  223.                         ENDIF 
  224.                 ENDSELECT
  225.         ENDSELECT
  226.         ReplyMsg(msg)
  227.     ENDWHILE
  228. ENDPROC
  229. /**/
  230. /*"p_LookcrMessage()"*/
  231. PROC p_LookcrMessage() 
  232.    DEF mes:PTR TO intuimessage
  233.    DEF g:PTR TO gadget
  234.    DEF pvn,cnn
  235.    DEF type=0,infos=NIL,ret=FALSE,pivz
  236.    DEF curnode:PTR TO ln,ca:PTR TO xarg
  237.    DEF curx:PTR TO xblock
  238.    dWriteF(['p_LookcrMessage()\n'],0)
  239.    WHILE mes:=Gt_GetIMsg(cr_window.userport)
  240.        type:=mes.class
  241.        SELECT type
  242.             CASE IDCMP_CLOSEWINDOW; ret:=TRUE
  243.             CASE IDCMP_MOUSEBUTTONS
  244.                 IF Mouse()=2
  245.                     curnode:=p_GetAdrNode(currentlist,currentnode)
  246.                     curx:=curnode
  247.                     currentlist:=curx.predlist
  248.                     currentnode:=0
  249.                     p_RendercrWindow()
  250.                 ENDIF
  251.             CASE IDCMP_GADGETDOWN
  252.                 type:=IDCMP_GADGETUP
  253.             CASE IDCMP_REFRESHWINDOW
  254.                 IF mb.zoomed=FALSE THEN pivz:=TRUE ELSE pivz:=FALSE
  255.                 mb.zoomed:=pivz
  256.                 p_RendercrWindow()
  257.             CASE IDCMP_GADGETUP
  258.                 g:=mes.iaddress
  259.                 infos:=g.gadgetid
  260.                 SELECT infos
  261.                     CASE GA_GLIST
  262.                         currentnode:=mes.code
  263.                         donewlist:
  264.                         IF p_EmptyList(currentlist)<>-1
  265.                             curnode:=p_GetAdrNode(currentlist,currentnode)
  266.                             IF StrCmp(curnode.name,'»» ',3)
  267.                                 curx:=curnode
  268.                                 currentlist:=curx.list
  269.                                 currentnode:=0
  270.                                 p_RendercrWindow()
  271.                             ENDIF
  272.                         ENDIF
  273.                     CASE GA_GEDIT
  274.                         doedit:
  275.                         p_CLIRun(mb.editcmd,'ENV:',4000,0)
  276.                     CASE GA_G4
  277.                         reelquit:=TRUE
  278.                     CASE GA_G_WB
  279.                         dowbrun:
  280.                         curnode:=p_GetAdrNode(currentlist,currentnode)
  281.                         curx:=curnode
  282.                         IF StrCmp(curnode.name,'»» ',3) 
  283.                             NOP
  284.                         ELSE
  285.                             p_StartProgram(currentlist,currentnode,FMODE_WB,0)
  286.                             ca:=curnode
  287.                             IF ca.noclosew THEN ret:=FALSE ELSE ret:=TRUE
  288.                         ENDIF
  289.                     CASE GA_G_CLI
  290.                         doclirun:
  291.                         curnode:=p_GetAdrNode(currentlist,currentnode)
  292.                         curx:=curnode
  293.                         IF StrCmp(curnode.name,'»» ',3) 
  294.                             NOP
  295.                         ELSE
  296.                             p_StartProgram(currentlist,currentnode,FMODE_CLI,0)
  297.                             ca:=curnode
  298.                             IF ca.noclosew THEN ret:=FALSE ELSE ret:=TRUE
  299.                         ENDIF
  300.                     CASE GA_G_INFO
  301.                 ENDSELECT
  302.             CASE IDCMP_RAWKEY
  303.                 infos:=mes.code
  304.                 SELECT infos
  305.                     CASE 18 /* Edit */
  306.                         JUMP doedit
  307.                     CASE 69 /* Esc */
  308.                         curnode:=p_GetAdrNode(currentlist,currentnode)
  309.                         curx:=curnode
  310.                         currentlist:=curx.predlist
  311.                         currentnode:=0
  312.                         p_RendercrWindow()
  313.                     CASE 49 /* W */
  314.                         curnode:=p_GetAdrNode(currentlist,currentnode)
  315.                         curx:=curnode
  316.                         IF StrCmp(curnode.name,'»» ',3) 
  317.                             NOP
  318.                         ELSE
  319.                             JUMP dowbrun
  320.                         ENDIF
  321.                     CASE 51 /* C */
  322.                         curnode:=p_GetAdrNode(currentlist,currentnode)
  323.                         curx:=curnode
  324.                         IF StrCmp(curnode.name,'»» ',3) 
  325.                             NOP
  326.                         ELSE
  327.                             JUMP doclirun
  328.                         ENDIF
  329.                     CASE 32; reelquit:=TRUE
  330.                     CASE 68 /* RETURN */
  331.                         curnode:=p_GetAdrNode(currentlist,currentnode)
  332.                         curx:=curnode
  333.                         IF StrCmp(curnode.name,'»» ',3) 
  334.                             JUMP donewlist
  335.                         ELSE
  336.                             p_StartProgram(currentlist,currentnode,0,0)
  337.                             ca:=curnode
  338.                             IF ca.noclosew THEN ret:=FALSE ELSE ret:=TRUE
  339.                         ENDIF
  340.                     CASE 76 /* UP */
  341.                         pvn:=currentnode-1
  342.                         IF pvn=-1 THEN currentnode:=0 ELSE currentnode:=pvn
  343.                         p_RendercrWindow()
  344.                     CASE 77 /* DOWN */
  345.                         pvn:=currentnode+1
  346.                         cnn:=p_CountNodes(currentlist)
  347.                         cnn:=cnn-1
  348.                         IF pvn>=cnn THEN currentnode:=cnn ELSE currentnode:=pvn
  349.                         p_RendercrWindow()
  350.                 ENDSELECT
  351.         ENDSELECT
  352.         Gt_ReplyIMsg(mes)
  353.     ENDWHILE
  354.     /*WHILE mes:=Gt_GetIMsg(cr_window.userport) DO Gt_ReplyIMsg(mes)*/
  355.     RETURN ret
  356. ENDPROC
  357. /**/
  358. /*"p_WriteFWBMessage(numa,lisa:PTR TO LONG)"*/
  359. PROC p_WriteFWBMessage(numa,lisa:PTR TO LONG) 
  360.    DEF b
  361.    DEF fullname[256]:STRING
  362.    DEF tw:PTR TO wbarg,ml=NIL
  363.    WriteF('NumArgs:\d\n',numa)
  364.    FOR b:=0 TO numa-1
  365.       tw:=lisa[b*2]
  366.       ml:=DupLock(lisa[b*2])
  367.       NameFromLock(ml,fullname,256)
  368.       WriteF('Name :\s Lock:\h FullName:\s\n',lisa[(b*2)+1],ml,fullname)
  369.       IF ml THEN UnLock(ml)
  370.    ENDFOR
  371. ENDPROC
  372. /**/
  373. /**/
  374. /*"APP Proc"*/
  375. /*"p_InitWBHandler()"*/
  376. PROC p_InitWBHandler() HANDLE 
  377.     DEF ifh
  378.     DEF ofh
  379.     DEF wbh
  380.     dWriteF(['p_InitWBHandler()\n'],0)
  381.     IF (ifh:=Open('NIL:',1006))=NIL THEN Raise(NIL)
  382.     IF (ofh:=Open('NIL:',1005))=NIL THEN Raise(NIL)
  383.     SystemTagList('L:WBStart-Handler',[SYS_INPUT,ifh,
  384.                                       SYS_OUTPUT,ofh,
  385.                                       SYS_ASYNCH,TRUE,
  386.                                       SYS_USERSHELL,TRUE,
  387.                                       NP_CONSOLETASK,NIL,
  388.                                       NP_WINDOWPTR,NIL])
  389.     Delay(25)
  390.     wbh:=FindPort('WBStart-Handler Port')
  391.     Raise(wbh)
  392. EXCEPT
  393.     IF Not(wbh)
  394.         IF ifh THEN Close(ifh)
  395.         IF ofh THEN Close(ofh)
  396.     ENDIF
  397.     RETURN wbh
  398. ENDPROC
  399. /**/
  400. /*"p_StartProgram(list:PTR TO lh,numnode,numa,lisa:PTR TO LONG)"*/
  401. PROC p_StartProgram(list:PTR TO lh,numnode,forcemode,apm:PTR TO appmessage)
  402.     DEF rnode:PTR TO xarg,n:PTR TO ln
  403.     DEF str[256]:STRING,pv[256]:STRING
  404.     DEF cs[256]:STRING,r,cmd[512]:STRING,cps[50]:STRING
  405.     DEF preds[256]:STRING,succs[256]:STRING,pos
  406.     DEF mwbarg:PTR TO wbarg
  407.     dWriteF(['p_StartProgram()\n'],0)
  408.     rnode:=p_GetAdrNode(list,numnode)
  409.     n:=rnode
  410.     IF forcemode=0 THEN StrCopy(cps,rnode.mode,ALL)
  411.     IF forcemode=FMODE_WB THEN StrCopy(cps,'WB',2)
  412.     IF forcemode=FMODE_CLI THEN StrCopy(cps,'CLI',3)
  413.     IF StrCmp(cps,'WB',2)
  414.         p_WBRun(n.name,rnode.curdir,rnode.stack,rnode.pri,apm)
  415.     ELSEIF StrCmp(cps,'CLI',3)
  416.         StringF(str,'\s',rnode.curdir)
  417.         AddPart(str,'',512)
  418.         StringF(cmd,'\s\s ',str,n.name)
  419.         IF EstrLen(rnode.args)<>0
  420.             pos:=InStr(rnode.args,'[]',0)
  421.             IF pos<>-1
  422.                 IF pos<>0
  423.                     MidStr(preds,rnode.args,0,pos-2)
  424.                 ELSE
  425.                     StrCopy(preds,'',1)
  426.                 ENDIF
  427.                 MidStr(succs,rnode.args,pos+3,ALL)
  428.                 StrAdd(cmd,preds,ALL)
  429.             ENDIF
  430.         ENDIF
  431.         IF apm<>0
  432.             mwbarg:=apm.arglist
  433.             FOR r:=0 TO apm.numargs-1
  434.                 NameFromLock(mwbarg[r].lock,pv,256)
  435.                 AddPart(pv,'',256)
  436.                 StringF(cs,' "\s\s" ',pv,mwbarg[r].name)
  437.                 StrAdd(cmd,cs,ALL)
  438.             ENDFOR
  439.             IF EstrLen(rnode.args)<>0 THEN StrAdd(cmd,succs,ALL)
  440.             p_CLIRun(cmd,rnode.curdir,rnode.stack,rnode.pri)
  441.         ELSE
  442.             IF EstrLen(rnode.args)<>0 THEN StrAdd(cmd,succs,ALL)
  443.             p_CLIRun(cmd,rnode.curdir,rnode.stack,rnode.pri)
  444.         ENDIF
  445.     ENDIF
  446.     RETURN r
  447. ENDPROC
  448. /**/
  449. /*"p_WBRun(com,di,st,pr,num_arg,arg_list)"*/
  450. PROC p_WBRun(com,dir,st,pr,apmh:PTR TO appmessage) HANDLE
  451.     DEF execmsg:PTR TO mn
  452.     DEF wbsm:wbstartmsg
  453.     DEF rc=FALSE
  454.     DEF node:PTR TO ln
  455.     dWriteF(['wb_WBRun()\n'],0)
  456.     /*=== Init Handler ===*/
  457.     Forbid()
  458.     mb.wbhandle:=FindPort('WBStart-Handler Port')
  459.     Permit()
  460.     IF mb.wbhandle=0 THEN mb.wbhandle:=p_InitWBHandler()
  461.     wbsm:=New(SIZEOF wbstartmsg)
  462.     execmsg:=wbsm
  463.     node:=execmsg
  464.     node.type:=NT_MESSAGE
  465.     node.pri:=0
  466.     execmsg.replyport:=mb.prgport
  467.     wbsm.name:=com
  468.     wbsm.dirlock:=Lock(dir,-2)
  469.     wbsm.stack:=st
  470.     wbsm.prio:=pr
  471.     wbsm.numargs:=IF apmh<>0 THEN apmh.numargs ELSE 0
  472.     wbsm.arglist:=IF apmh<>0 THEN apmh.arglist ELSE 0
  473.     Forbid()
  474.     IF mb.wbhandle
  475.         PutMsg(mb.wbhandle,wbsm)
  476.     ENDIF
  477.     Permit()
  478.     IF mb.wbhandle
  479.         WaitPort(mb.prgport)
  480.         GetMsg(mb.prgport)
  481.         rc:=wbsm.stack
  482.     ENDIF
  483.     IF rc=0 
  484.         p_Alert('WBRun Failed.')
  485.         p_CLIRun(com,dir,st,pr)
  486.         p_Alert('CLIRun.')
  487.     ENDIF
  488.     Raise(ER_NONE)
  489. EXCEPT
  490.     IF wbsm.dirlock THEN UnLock(wbsm.dirlock)
  491.     IF wbsm THEN Dispose(wbsm)
  492.     RETURN exception
  493. ENDPROC
  494. /**/
  495. /*"p_CLIRun(cmd,dir,sta,pp)"*/
  496. PROC p_CLIRun(cmd,dir,sta,pp) HANDLE
  497.     DEF ofh:PTR TO filehandle
  498.     DEF ifh:PTR TO filehandle
  499.     DEF newct=NIL:PTR TO mp
  500.     DEF oldct:PTR TO mp
  501.     DEF oldcd=NIL
  502.     DEF newcd=NIL
  503.     DEF test
  504.     dWriteF(['wb_CLIRun() \s\n'],[cmd])
  505.     IF ofh:=Open('NIL:',1006)
  506.         IF IsInteractive(ofh)
  507.             newct:=ofh.type
  508.             oldct:=SetConsoleTask(newct)
  509.             ifh:=Open('CONSOLE:',1005)
  510.             SetConsoleTask(oldct)
  511.         ELSE
  512.             ifh:=Open('NIL:',1005)
  513.         ENDIF
  514.     ENDIF
  515.     newcd:=Lock(dir,-2)
  516.     oldcd:=CurrentDir(newcd)
  517.     IF test:=SystemTagList(cmd,[SYS_OUTPUT,NIL,
  518.                          SYS_INPUT,NIL,
  519.                          SYS_ASYNCH,TRUE,
  520.                          SYS_USERSHELL,FALSE,
  521.                          NP_STACKSIZE,sta,
  522.                          NP_PRIORITY,pp,
  523.                          NP_PATH,NIL,
  524.                          NP_CONSOLETASK,newct,
  525.                          0])
  526.     ENDIF
  527.     CurrentDir(oldcd)
  528.     IF newcd THEN UnLock(newcd)
  529.     IF ofh THEN Close(ofh)
  530.     IF ifh THEN Close(ifh)
  531.     Raise(ER_NONE)
  532. EXCEPT
  533.     RETURN exception
  534. ENDPROC
  535. /**/
  536. /*"p_Alert(texte)"*/
  537. PROC p_Alert(texte) 
  538.         Gt_SetGadgetAttrsA(g_info,cr_window,NIL,[GTTX_BORDER,TRUE,GTTX_TEXT,texte,TAG_DONE,0])
  539. ENDPROC
  540. /**/
  541. /*"p_InitAPP()"*/
  542. PROC p_InitAPP() HANDLE
  543.     DEF r:PTR TO notifyrequest
  544.     DEF p:PTR TO mp
  545.     DEF myb:PTR TO newbroker,errorcx,filter,sender,translate,pv
  546.     DEF txt[256]:STRING
  547.     mb.listxblock:=p_InitList()
  548.     mb.zoomed:=FALSE
  549.     StringF(txt,'HotKey=\s.',mb.cxhotkey)
  550.     IF mb.listxblock<>NIL
  551.         IF r:=New(SIZEOF notifyrequest)
  552.             IF FileLength('Env:ClickCx.Prefs')=-1 THEN Raise(ER_NOPREFS)
  553.             mb.nreq:=r
  554.             r.name:='Env:ClickCx.Prefs'
  555.             r.flags:=NRF_SEND_SIGNAL
  556.             r.port:=FindTask(0)
  557.             r.signalnum:=AllocSignal(-1)
  558.             mb.nreqsigflag:=Shl(1,r.signalnum)
  559.             StartNotify(mb.nreq)
  560.             IF p:=CreateMsgPort()
  561.                 mb.prgport:=p
  562.                 mb.prgsigflag:=Shl(1,p.sigbit)
  563.                 myb:=[NB_VERSION,0,
  564.                       'ClickCx',
  565.                       txt,
  566.                       'Application Window © 1995 NasGûl',
  567.                       NBU_UNIQUE,
  568.                       COF_SHOW_HIDE,
  569.                       0,0,NIL,0]:newbroker
  570.                 IF p:=CreateMsgPort()
  571.                     mb.cxport:=p
  572.                     mb.cxsigflag:=Shl(1,p.sigbit)
  573.                     myb.port:=mb.cxport
  574.                     myb.pri:=0
  575.                     IF pv:=CxBroker(myb,NIL)
  576.                         mb.broker:=pv
  577.                         filter:=CreateCxObj(CX_FILTER,mb.cxhotkey,NIL)
  578.                         errorcx:=CxObjError(filter)
  579.                         IF errorcx=0
  580.                             AttachCxObj(mb.broker,filter)
  581.                             sender:=CreateCxObj(CX_SEND,mb.cxport,EVT_HOTKEY)
  582.                             AttachCxObj(filter,sender)
  583.                             translate:=CreateCxObj(CX_TRANSLATE,NIL,NIL)
  584.                             AttachCxObj(filter,translate)
  585.                             IF (errorcx:=CxObjError(filter))=0
  586.                                 ActivateCxObj(mb.broker,1)
  587.                             ELSE
  588.                                 Raise(ER_CX)
  589.                             ENDIF
  590.                         ELSE
  591.                             Raise(ER_CX)
  592.                         ENDIF
  593.                     ELSE
  594.                         Raise(ER_CX)
  595.                     ENDIF
  596.                 ELSE
  597.                     Raise(ER_PORT)
  598.                 ENDIF
  599.             ELSE
  600.                 Raise(ER_PORT)
  601.             ENDIF
  602.         ELSE
  603.             Raise(ER_MEM)
  604.         ENDIF
  605.     ELSE
  606.         Raise(ER_MEM)
  607.     ENDIF
  608.     Forbid()
  609.     p_ReadFile('Env:ClickCx.Prefs')
  610.     Permit()
  611.     currentnode:=0
  612.     currentlist:=mb.listxblock
  613.     Raise(ER_NONE)
  614. EXCEPT
  615.     RETURN exception
  616. ENDPROC
  617. /**/
  618. /*"p_RemAPP()"*/
  619. PROC p_RemAPP()
  620.     DEF r:PTR TO notifyrequest
  621.     dWriteF(['p_RemAPP()\n'],0)
  622.     r:=mb.nreq
  623.     IF r
  624.         IF r.signalnum THEN FreeSignal(r.signalnum)
  625.         IF r THEN EndNotify(r)
  626.     ENDIF
  627.     IF EstrLen(mb.cxhotkey)<>0 THEN DisposeLink(mb.cxhotkey)
  628.     IF mb.prgport THEN DeleteMsgPort(mb.prgport)
  629.     IF mb.broker THEN DeleteCxObjAll(mb.broker)
  630.     IF mb.cxport THEN DeleteMsgPort(mb.cxport)
  631. ENDPROC
  632. /**/
  633. /*"p_CleanPrgList(list:PTR TO lh)"*/
  634. PROC p_CleanPrgList(list:PTR TO lh)
  635.     DEF n:PTR TO ln
  636.     DEF nx:PTR TO xblock
  637.     dWriteF(['p_CleanPrgList() \h\n'],[list])
  638.     n:=list.head
  639.     WHILE n
  640.         IF n.succ<>0
  641.             IF StrCmp(n.name,'»» ',3)
  642.                 nx:=n
  643.                 p_EnleveNode(list,p_GetNumNode(list,n),FALSE,0)
  644.                 p_CleanPrgList(nx.list)
  645.             ELSE
  646.                 p_EnleveNode(list,p_GetNumNode(list,n),TRUE,[18,DISL,22,DISL,26,DISL,DISE])
  647.             ENDIF
  648.         ENDIF
  649.         n:=n.succ
  650.     ENDWHILE
  651. ENDPROC
  652. /**/
  653. /*"p_ReadFile(str)"*/
  654. PROC p_ReadFile(str)
  655.     DEF fh,buf[1000]:ARRAY,numline=1
  656.     DEF nom[256]:STRING,rn[256]:STRING
  657.     DEF m:PTR TO LONG
  658.     DEF test
  659.     DEF end
  660.     DEF str_type[80]:STRING
  661.     DEF str_name[80]:STRING
  662.     DEF str_dir[256]:STRING
  663.     DEF str_mode[10]:STRING,st,pri
  664.     DEF str_args[80]:STRING
  665.     DEF mx:PTR TO xblock
  666.     DEF ma:PTR TO xarg,ncw
  667.     DEF lt[100]:ARRAY OF LONG,numlist=0,rnumlist=0
  668.     dWriteF(['p_ReadFile() \s\n'],[str])
  669.     lt[numlist]:=mb.listxblock
  670.     IF fh:=Open(str,OLDFILE)
  671.         m:=[0,0,0,0,0,0,0,0,0]
  672.         WHILE test:=Fgets(fh,buf,1000)
  673.                 StringF(nom,'\s',test)
  674.                 StrCopy(rn,test,(StrLen(test)-1))
  675.                 IF Not(StrCmp(rn,'#',1))
  676.                     IF EstrLen(rn)=0 THEN JUMP sk
  677.                     IF StrLen(test)=1 THEN JUMP sk
  678.                     IF getArg(rn,'StartBlock/K,Name/K,Dir/K,Mode/K,Stack/K/N,Pri/K/N,Args/K,EndBlock/S,NoCloseWindow/S',m)
  679.                         /*
  680.                         StringF(str_type,'»» \s',m[0])
  681.                         StringF(str_name,'\s',m[1])
  682.                         StringF(str_dir,'\s',m[2])
  683.                         */
  684.                         StringF(str_type,'»» \s',m[0])
  685.                         StrCopy(str_name,m[1],ALL)
  686.                         StrCopy(str_dir,m[2],ALL)
  687.  
  688.                         StringF(str_mode,'\s',m[3]);UpperStr(str_mode)
  689.                         StringF(str_args,'\s',m[6])
  690.                         IF m[4] THEN st:=Long(m[4]) ELSE st:=4000
  691.                         IF m[5] THEN pri:=Long(m[5]) ELSE pri:=0
  692.                         end:=m[7]
  693.                         ncw:=m[8]
  694.                         IF end
  695.                             numlist:=numlist-1
  696.                             JUMP sk
  697.                         ENDIF
  698.                         IF EstrLen(str_type)<>3 /* StartBlock */
  699.                             IF mx:=New(SIZEOF xblock)
  700.                                 mx.list:=p_InitList()
  701.                                 IF mx.list<>NIL
  702.                                     IF numlist=0 THEN mx.predlist:=mb.listxblock ELSE mx.predlist:=lt[numlist-1]
  703.                                     Forbid()
  704.                                     p_AjouteNode(lt[numlist],str_type,mx)
  705.                                     Permit()
  706.                                     /*WriteF('Block -> p_AjouteNode() \s CurList : \h IntiList:\h NumList:\d PredList:\h\n',str_type,lt[numlist],mx.list,numlist,mx.predlist)*/
  707.                                     numlist:=numlist+1
  708.                                     mx.numlist:=rnumlist
  709.                                     lt[numlist]:=mx.list
  710.                                     JUMP sk
  711.                                 ENDIF
  712.                             ENDIF
  713.                         ELSEIF str_name
  714.                             IF ma:=New(SIZEOF xarg)
  715.                                 IF numlist=0 THEN ma.predlist:=mb.listxblock ELSE ma.predlist:=lt[numlist-1]
  716.                                 ma.curdir:=String(EstrLen(str_dir))
  717.                                 StrCopy(ma.curdir,str_dir,EstrLen(str_dir))
  718.                                 ma.mode:=String(EstrLen(str_mode))
  719.                                 StrCopy(ma.mode,str_mode,EstrLen(str_mode))
  720.                                 ma.args:=String(EstrLen(str_args))
  721.                                 StrCopy(ma.args,str_args,EstrLen(str_args))
  722.                                 ma.stack:=st
  723.                                 ma.pri:=pri
  724.                                 ma.noclosew:=IF ncw THEN TRUE ELSE FALSE
  725.                                 Forbid()
  726.                                 p_AjouteNode(lt[numlist],str_name,ma)
  727.                                 Permit()
  728.                                 /*WriteF('Command -> p_AjouteNode() \s CurList : \h PredList:\h\n',str_name,mx.list,ma.predlist)*/
  729.                                 JUMP sk
  730.                             ENDIF
  731.                         ENDIF
  732.                     ELSE
  733.                         EasyRequestArgs(0,[20,0,0,'Error in Line \d\n\s[40]','Merci'],0,[numline,rn])
  734.                         JUMP fin
  735.                     ENDIF
  736.                     sk:
  737.                     m[0]:=0;m[1]:=0;m[2]:=0;m[3]:=0;m[4]:=0;m[5]:=0;m[6]:=0;m[7]:=0;m[8]:=0
  738.                 ENDIF
  739.                 numline:=numline+1
  740.         ENDWHILE
  741.         fin:
  742.         Close(fh)
  743.         IF numlist<>0 THEN EasyRequestArgs(0,[20,0,0,'(Start+End)*Block Error (list look strange..) [\d]','Merci'],0,[numlist])
  744.     ENDIF
  745. ENDPROC
  746. /**/
  747. /*"getArg(argu,temp,a:PTR TO LONG)"*/
  748. PROC getArg(argu,temp,a:PTR TO LONG)
  749.     DEF myc:PTR TO csource
  750.     DEF ma:PTR TO rdargs
  751.     DEF rdarg=NIL
  752.     DEF argstr[256]:STRING
  753.     DEF ret=NIL
  754.     StrCopy(argstr,argu,ALL)
  755.     StrAdd(argstr,'\n',1)
  756.     IF ma:=AllocDosObject(DOS_RDARGS,NIL)
  757.         myc:=New(SIZEOF csource)
  758.         myc.buffer:=argstr
  759.         myc.length:=EstrLen(argstr)
  760.         ma.flags:=4
  761.         CopyMem(myc,ma.source,SIZEOF csource)
  762.         IF rdarg:=ReadArgs(temp,a,ma)
  763.             ret:=a
  764.             IF rdarg THEN FreeArgs(rdarg)
  765.         ELSE
  766.         ENDIF
  767.         FreeDosObject(DOS_RDARGS,ma)
  768.     ELSE
  769.         WriteF('AllocDosObject failed !!\n')
  770.     ENDIF
  771.     RETURN ret
  772. ENDPROC
  773. /**/
  774. /*"p_WriteFReelList(list:PTR TO lh)"*/
  775. PROC p_WriteFReelList(list:PTR TO lh)
  776.     DEF n:PTR TO ln
  777.     DEF x:PTR TO xblock
  778.     DEF a:PTR TO xarg,test,str[80]:STRING
  779.     n:=list.head
  780.     WHILE n
  781.         IF n.succ<>0
  782.             StrCopy(str,n.name,ALL)
  783.             IF test:=StrCmp(str,'»» ',3)
  784.                 x:=n
  785.                 WriteF('XBlock : \h Name : \s Adr List: \h Adr PredList :\h\n',x,n.name,x.list,x.predlist)
  786.                 /*p_WriteFList(x.list)*/
  787.                 p_WriteFReelList(x.list)
  788.             ELSE
  789.                 a:=n
  790.                 WriteF('Xarg : \h Name : \s Dir : \s Mode : \s Stack : \d Pri : \d Args: \s\n',
  791.                 a,n.name,a.curdir,a.mode,a.stack,a.pri,a.args)
  792.             ENDIF
  793.         ENDIF
  794.         n:=n.succ
  795.         IF CtrlC() THEN JUMP fini
  796.     ENDWHILE
  797.     fini:
  798. ENDPROC
  799. /**/
  800. /*"p_StartCli()"*/
  801. PROC p_StartCli() HANDLE 
  802. /*===============================================================================
  803.  = Para         : NONE.
  804.  = Return       : ER_NONE if ok,else the error.
  805.  = Description  : Get .info and lock current dir.
  806.  ==============================================================================*/
  807.     DEF myargs:PTR TO LONG,rdargs=NIL
  808.     DEF editcmd[256]:STRING
  809.     dWriteF(['p_StartCli()\n'],0)
  810.     myargs:=[0,0,0,0,0]
  811.     IF rdargs:=ReadArgs('HotKey/K,Priority/N,EditorName/K,AllScreen/S',myargs,NIL)
  812.         IF myargs[0] 
  813.             mb.cxhotkey:=String(EstrLen(myargs[0]))
  814.             StrCopy(mb.cxhotkey,myargs[0],ALL) 
  815.         ELSE
  816.             mb.cxhotkey:=String(EstrLen('shift ctrl esc'))
  817.             StrCopy(mb.cxhotkey,'shift ctrl esc',ALL)
  818.         ENDIF
  819.         IF myargs[1] THEN mb.cxpri:=Long(myargs[1]) ELSE mb.cxpri:=0
  820.         IF myargs[2]
  821.             StringF(editcmd,'\s "\s"',myargs[2],'ClickCx.Prefs')
  822.         ELSE
  823.             StrCopy(editcmd,'C:ed "ClickCx.Prefs"',ALL)
  824.         ENDIF
  825.         mb.editcmd:=String(EstrLen(editcmd))
  826.         StrCopy(mb.editcmd,editcmd,ALL)
  827.         IF myargs[3]
  828.             StrCopy(autocmd,myargs[3],ALL)
  829.         ELSE
  830.             StrCopy(autocmd,'',ALL)
  831.         ENDIF
  832.         IF myargs[4] THEN mb.allscreen:=TRUE ELSE mb.allscreen:=FALSE
  833.     ELSE
  834.         Raise(ER_BADARGS)
  835.     ENDIF
  836.     Raise(ER_NONE)
  837. EXCEPT
  838.     IF rdargs THEN FreeArgs(rdargs)
  839.     RETURN exception
  840. ENDPROC
  841. /**/
  842. /*"p_StartWb()"*/
  843. PROC p_StartWb() HANDLE
  844. /*===============================================================================
  845.  = Para         : NONE
  846.  = Return       : ER_NONE if ok,else the error.
  847.  = Description  : Get .info and lock current dir.
  848.  ==============================================================================*/
  849.     DEF wb:PTR TO wbstartup
  850.     DEF args:PTR TO wbarg
  851.     DEF prgname[256]:STRING
  852.     DEF disk=NIL:PTR TO diskobject
  853.     DEF str[256]:STRING,hk[80]:STRING,en[80]:STRING
  854.     dWriteF(['p_StartWb()\n'],0)
  855.     wb:=wbmessage
  856.     args:=wb.arglist
  857.     /*FindTask(0)*/
  858.     StrCopy(prgname,args[0].name,ALL)
  859.     baselock:=CurrentDir(args[0].lock)
  860.     IF (disk:=GetDiskObject(prgname))=NIL THEN Raise(ER_NOICONS)
  861.     IF str:=FindToolType(disk.tooltypes,'CX_POPKEY')
  862.         StrCopy(hk,str,ALL)
  863.     ELSE
  864.         StrCopy(hk,'shift ctrl esc',ALL)
  865.     ENDIF
  866.     mb.cxhotkey:=String(EstrLen(hk))
  867.     StrCopy(mb.cxhotkey,hk,ALL)
  868.     IF str:=FindToolType(disk.tooltypes,'EDITORNAME')
  869.         StringF(en,'\s "ClickCx.Prefs"',str)
  870.     ELSE
  871.         StrCopy(en,'C:ed "ClickCx.Prefs"',ALL)
  872.     ENDIF
  873.     mb.editcmd:=String(EstrLen(en))
  874.     StrCopy(mb.editcmd,en,ALL)
  875.     IF str:=FindToolType(disk.tooltypes,'CX_PRIORITY')
  876.         mb.cxpri:=Val(str,NIL)
  877.     ELSE
  878.         mb.cxpri:=0
  879.     ENDIF
  880.     IF str:=FindToolType(disk.tooltypes,'ALLSCREEN') THEN mb.allscreen:=TRUE ELSE mb.allscreen:=FALSE
  881.     IF str:=FindToolType(disk.tooltypes,'CX_POPUP')
  882.         StrCopy(hk,str,ALL)
  883.         UpperStr(hk)
  884.         IF StrCmp(hk,'NO',2) THEN popup:=FALSE ELSE popup:=TRUE
  885.     ENDIF
  886.     IF str:=FindToolType(disk.tooltypes,'COMMAND')
  887.         StrCopy(autocmd,str,ALL)
  888.     ELSE
  889.         StrCopy(autocmd,'',ALL)
  890.     ENDIF
  891.     IF disk THEN FreeDiskObject(disk)
  892.     Raise(ER_NONE)
  893. EXCEPT
  894.     RETURN exception
  895. ENDPROC
  896. /**/
  897. /**/
  898. /*"main()"*/
  899. PROC main() HANDLE 
  900.     DEF testmain
  901.     tattr:=['topaz.font',8,0,0]:textattr
  902.     p_DoReadHeader({banner})
  903.     IF (testmain:=p_OpenLibraries())<>ER_NONE THEN Raise(testmain)
  904.     IF (mb:=New(SIZEOF xdatabase))=NIL THEN Raise(ER_MEM)
  905.     IF wbmessage<>NIL
  906.         IF (testmain:=p_StartWb())<>ER_NONE THEN Raise(testmain)
  907.     ELSE
  908.         IF (testmain:=p_StartCli())<>ER_NONE THEN Raise(testmain)
  909.     ENDIF
  910.     IF (testmain:=p_InitAPP())<>ER_NONE THEN Raise(testmain)
  911.     IF popup
  912.         IF (testmain:=p_OpenWindow())<>ER_NONE THEN Raise(testmain)
  913.     ENDIF
  914.     IF EstrLen(autocmd)<>0 THEN p_CLIRun(autocmd,'Sys:',4000,0)
  915.     REPEAT
  916.         p_LookAllMessage()
  917.     UNTIL reelquit=TRUE
  918.     Raise(ER_NONE)
  919. EXCEPT
  920.     IF cr_window THEN p_CloseWindow()
  921.     IF mb THEN p_RemAPP()
  922.     IF baselock<>NIL THEN UnLock(baselock)
  923.     p_CloseLibraries()
  924.     SELECT exception
  925.         CASE ER_LOCKSCREEN; WriteF('Lock Screen Failed.\n')
  926.         CASE ER_VISUAL;     WriteF('Error Visual.\n')
  927.         CASE ER_CONTEXT;    WriteF('Error Context.\n')
  928.         CASE ER_MENUS;      WriteF('Error Menus.\n')
  929.         CASE ER_GADGET;     WriteF('Error Gadget.\n')
  930.         CASE ER_WINDOW;     WriteF('Error Window.\n')
  931.         CASE ER_MEM;        WriteF('Error Mem.\n')
  932.         CASE ER_PORT;       WriteF('Error Port.\n')
  933.         CASE ER_NOPREFS;    WriteF('Error NoPrefs.\n')
  934.         CASE ER_CX;         WriteF('Error Commodities.\n')
  935.         CASE ER_BADARGS;    WriteF('Error Bad Args.\n')
  936.         CASE ER_NOICONS;    WriteF('Error No Icon.\n')
  937.         CASE ER_APPWIN;     WriteF('Error AppWindow.\n')
  938.     ENDSELECT
  939. ENDPROC
  940. /**/
  941.